home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
UNIXLIB37B
/
!UnixLib37
/
src
/
signal
/
c
/
sigpreempt
< prev
next >
Wrap
Text File
|
1996-11-09
|
2KB
|
69 lines
/****************************************************************************
*
* $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigpreempt,v $
* $Date: 1996/10/30 22:04:51 $
* $Revision: 1.1 $
* $State: Rel $
* $Author: unixlib $
*
* $Log: sigpreempt,v $
* Revision 1.1 1996/10/30 22:04:51 unixlib
* Initial revision
*
***************************************************************************/
static const char rcs_id[] = "$Id: sigpreempt,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
/* Signal pre-emption implementation. */
#include <errno.h>
#include <signal.h>
#include <unixlib/sigstate.h>
#include <sys/unix.h>
int unixlib_preempt_signals (struct unixlib_signal_preempt *preempter,
int signo, int first_code, int last_code,
sighandler_t (*handler) (int, int, int))
{
if (signo <= 0 || signo >= NSIG)
{
errno = EINVAL;
return -1;
}
preempter->first = first_code;
preempter->last = last_code;
preempter->handler = handler;
preempter->next = __u->sigpreempt[signo];
__u->sigpreempt[signo] = preempter;
return 0;
}
/* Remove PREEMPTER from the chain for SIGNO. */
int
unixlib_unpreempt_signals (struct unixlib_signal_preempt *preempter, int signo)
{
struct unixlib_signal_preempt *p, *lastp;
if (signo <= 0 || signo >= NSIG)
{
errno = EINVAL;
return -1;
}
for (p = __u->sigpreempt[signo], lastp = NULL;
p != NULL; lastp = p, p = p->next)
if (p == preempter)
{
if (lastp == NULL)
__u->sigpreempt[signo] = p->next;
else
lastp->next = p->next;
return 0;
}
__u->sigpreempt[signo] = preempter;
errno = ENOENT;
return -1;
}